package com.newidea.jiangong.component;

import cn.hutool.core.map.MapUtil;
import cn.hutool.http.ContentType;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * 供热平台工具类
 */
@Component
public class HeatComponent {

    /**
     * 北京市智能供热管理云平台：登录地址
     */
    @Value("${collect.login.url}")
    private String loginUrl;
    /**
     * 获取部门结构树的地址
     */
    @Value("${collect.url.department}")
    private String departmentUrl;

    private final JdbcTemplate jdbcTemplate;

    public HeatComponent(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}

    /**
     * 登录北京市智能供热管理云平台用于采集：
     */
    public String getToken(String account, String password) {
        Map<String, Object> paramMap = MapUtil.newHashMap();
        paramMap.put("account", account);
        paramMap.put("password", password);
        JSONObject body = JSONUtil.parseObj(HttpUtil.post(loginUrl, paramMap));

        if (body.getBool("flag")) {
            return body.getJSONObject("data").getStr("token");
        } else {
            throw new RuntimeException("登录失败，错误信息：" + body.getStr("msg"));
        }
    }

    /**
     * 获取要采集的根部门id
     */
    public JSONArray getRootDepartments(String token) {
        // 获取部门树结构
        String treeJson = HttpRequest.post(departmentUrl).header("token", token).execute().body();
        JSONObject tree = JSONUtil.parseObj(treeJson);
        String code = tree.getStr("code");
        if ("200".equals(code)) {
            // 全部根节点部门
            JSONArray departments = new JSONArray();

            JSONArray dataArr = tree.getJSONArray("data");
            for (int i = 0; i < dataArr.size(); i++) {
                JSONObject json = dataArr.getJSONObject(i);
                // 部门
                JSONObject department = new JSONObject();
                // 部门id
                department.set("departmentId", json.getStr("id"))
                    // 部门名称
                    .set("departmentName", json.getStr("departmentName"))
                    // 部门类型
                    .set("departmentType", json.getStr("departmentType"));
                departments.add(department);
            }
            return departments;
        } else {
            throw new RuntimeException("获取部门树失败！错误码：" + code + "，错误信息：" + tree.getStr("msg"));
        }
    }

    /**
     * 获取post请求响应的数据
     *
     * @param paramJson json请求参数
     * @param url       请求url
     * @param token     token
     * @return 响应的数据
     */
    public JSONObject httpPost(JSONObject paramJson, String url, String token) {
        // 发送post
        String body = HttpRequest.post(url)
            // token加入到请求头中
            .header("token", token)
            .body(paramJson.toString(), ContentType.JSON.toString())
            .execute().body();
        JSONObject bodyJson = JSONUtil.parseObj(body);
        Integer code = bodyJson.getInt("code");
        if (code != 200) {
            throw new RuntimeException("错误码：" + code + "，错误信息：" + bodyJson.getStr("msg"));
        }
        return bodyJson.getJSONObject("data");
    }

    /**
     * 查询最新的采集时间
     *
     * @param tableName 查询表
     * @param company   数据所属公司
     * @return 最新的采集时间
     */
    public String getNewDate(String tableName, String company) {
        String queryCollectDate = "select max(create_time) from " + tableName + " where newest = true";
        queryCollectDate += " and company = ?";
        return jdbcTemplate.queryForObject(queryCollectDate, String.class, company);
    }
}
